home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / gnu / groff108.lha / groff-1.08 / include / stringclass.h < prev   
C/C++ Source or Header  |  1992-11-25  |  4KB  |  175 lines

  1. // -*- C++ -*-
  2. /* Copyright (C) 1989, 1990, 1991, 1992 Free Software Foundation, Inc.
  3.      Written by James Clark (jjc@jclark.com)
  4.  
  5. This file is part of groff.
  6.  
  7. groff is free software; you can redistribute it and/or modify it under
  8. the terms of the GNU General Public License as published by the Free
  9. Software Foundation; either version 2, or (at your option) any later
  10. version.
  11.  
  12. groff is distributed in the hope that it will be useful, but WITHOUT ANY
  13. WARRANTY; without even the implied warranty of MERCHANTABILITY or
  14. FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  15. for more details.
  16.  
  17. You should have received a copy of the GNU General Public License along
  18. with groff; see the file COPYING.  If not, write to the Free Software
  19. Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
  20.  
  21. #include <string.h>
  22. #include <stdio.h>
  23. #include <assert.h>
  24.  
  25. class string {
  26. public:
  27.   string();
  28.   string(const string &);
  29.   string(const char *);
  30.   string(const char *, int);
  31.   string(char);
  32.  
  33.   ~string();
  34.   
  35.   string &operator=(const string &);
  36.   string &operator=(const char *);
  37.   string &operator=(char);
  38.  
  39.   string &operator+=(const string &);
  40.   string &operator+=(const char *);
  41.   string &operator+=(char);
  42.   void append(const char *, int);
  43.   
  44.   int length() const;
  45.   int empty() const;
  46.   int operator*() const;
  47.  
  48.   string substring(int i, int n) const;
  49.  
  50.   char &operator[](int);
  51.   char operator[](int) const;
  52.  
  53.   void set_length(int i);
  54.   const char *contents() const;
  55.   int search(char) const;
  56.   char *extract() const;
  57.   void clear();
  58.   void move(string &);
  59.  
  60.   friend inline string operator+(const string &, const string &);
  61.   friend inline string operator+(const string &, const char *);
  62.   friend inline string operator+(const char *, const string &);
  63.   friend inline string operator+(const string &, char);
  64.   friend inline string operator+(char, const string &);
  65.  
  66.   friend inline int operator==(const string &, const string &);
  67.   friend inline int operator!=(const string &, const string &);
  68.   friend int operator<=(const string &, const string &);
  69.   friend int operator<(const string &, const string &);
  70.   friend int operator>=(const string &, const string &);
  71.   friend int operator>(const string &, const string &);
  72.  
  73. private:
  74.   char *ptr;
  75.   int len;
  76.   int sz;
  77.  
  78.   string(const char *, int, const char *, int);    // for use by operator+
  79.   void grow1();
  80. };
  81.  
  82.  
  83. inline char &string::operator[](int i)
  84. {
  85.   assert(i >= 0 && i < len);
  86.   return ptr[i];
  87. }
  88.  
  89. inline char string::operator[](int i) const
  90. {
  91.   assert(i >= 0 && i < len);
  92.   return ptr[i];
  93. }
  94.  
  95. inline int string::length() const
  96. {
  97.   return len;
  98. }
  99.  
  100. inline int string::empty() const
  101. {
  102.   return len == 0;
  103. }
  104.  
  105. inline int string::operator*() const
  106. {
  107.   return len;
  108. }
  109.  
  110. inline const char *string::contents() const
  111. {
  112.   return  ptr;
  113. }
  114.  
  115. inline string operator+(const string &s1, const string &s2)
  116. {
  117.   return string(s1.ptr, s1.len, s2.ptr, s2.len);
  118. }
  119.  
  120. inline string operator+(const string &s1, const char *s2)
  121. {
  122.   if (s2 == 0)
  123.     return s1;
  124.   else
  125.     return string(s1.ptr, s1.len, s2, strlen(s2));
  126. }
  127.  
  128. inline string operator+(const char *s1, const string &s2)
  129. {
  130.   if (s1 == 0)
  131.     return s2;
  132.   else
  133.     return string(s1, strlen(s1), s2.ptr, s2.len);
  134. }
  135.  
  136. inline string operator+(const string &s, char c)
  137. {
  138.   return string(s.ptr, s.len, &c, 1);
  139. }
  140.  
  141. inline string operator+(char c, const string &s)
  142. {
  143.   return string(&c, 1, s.ptr, s.len);
  144. }
  145.  
  146. inline int operator==(const string &s1, const string &s2)
  147. {
  148.   return (s1.len == s2.len 
  149.       && (s1.len == 0 || memcmp(s1.ptr, s2.ptr, s1.len) == 0));
  150. }
  151.  
  152. inline int operator!=(const string &s1, const string &s2)
  153. {
  154.   return (s1.len != s2.len 
  155.       || (s1.len != 0 && memcmp(s1.ptr, s2.ptr, s1.len) != 0));
  156. }
  157.  
  158. inline string string::substring(int i, int n) const
  159. {
  160.   assert(i >= 0 && i + n <= len);
  161.   return string(ptr + i, n);
  162. }
  163.  
  164. inline string &string::operator+=(char c)
  165. {
  166.   if (len >= sz)
  167.     grow1();
  168.   ptr[len++] = c;
  169.   return *this;
  170. }
  171.  
  172. void put_string(const string &, FILE *);
  173.  
  174. string as_string(int);
  175.